﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Threads</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>

<body>
<h1>线程</h1>

<p>由最近的<a href="../Hotkeys.htm">热键</a>、<a href="../commands/SetTimer.htm">定时的子程序</a>、<a href="../commands/Menu.htm">自定义的菜单项</a> 和 <a href="../commands/Gui.htm#Events">GUI 事件</a>所调用的执行流被定义为<strong>当前线程</strong>。<strong>当前线程</strong>可以是它自身子程序或由子程序调用的其它子程序中的执行命令。</p>
<p>尽管 AutoHotkey 没有真正地使用多线程，但却模拟了它的特性：如果启动了第二个线程，例如前一个热键仍在执行时又按了另一个热键，那么<strong>当前线程</strong>将被中断(暂时地停止)以允许新的线程变成<strong>当前的</strong>线程。如果在第二个线程还在运行时又启动了第三个线程，那么第二个和第一个线程都会进入休眠状态，以此类推。</p>
<p>在<strong>当前线程</strong>结束时，最近中断的那个线程将被恢复，以此类推，直到所有线程最终结束。在线程被恢复时，它的设置比如 <a href="ErrorLevel.htm">ErrorLevel</a> 和 <a href="../commands/SendMode.htm">SendMode </a>将自动恢复到中断前的状态；换句话说，线程不会受到中断的副作用(除了在<a href="../commands/WinActivate.htm">激活的窗口</a>中可能有改变 )。</p>
<p>注意: <a href="../commands/KeyHistory.htm">KeyHistory</a> 命令或菜单项显示了有多少线程处于中断状态，<a href="../commands/ListHotkeys.htm">ListHotkeys</a> 命令或菜单项显示了哪些热键拥有线程。</p>
<p>一个脚本可以同时产生多个 <a href="../commands/MsgBox.htm">MsgBox</a>, <a href="../commands/InputBox.htm">InputBox</a>, <a href="../commands/FileSelectFile.htm">FileSelectFile</a> 和 <a href="../commands/FileSelectFolder.htm">FileSelectFolder</a> 对话框。这是在先前的线程已经显示了一个对话框的情况下通过启用新线程来实现的(通过<a href="../Hotkeys.htm">热键</a>、<a href="../commands/SetTimer.htm">定时的子程序</a>、<a href="../commands/Menu.htm">自定义的菜单项</a>等等)。</p>
<p>默认情况下，如果一个给定的<a href="../Hotkeys.htm">热键</a>或<a href="../Hotstrings.htm">热字符串</a>子程序已经运行，那么它不能再次运行。可用 <a href="../commands/_MaxThreadsPerHotkey.htm">#MaxThreadsPerHotkey</a> 改变此特性。</p>
<h2>线程优先级</h2>
<p>比<strong>当前线程</strong>优先级低的线程(<a href="../Hotkeys.htm">热键</a>、<a href="../commands/SetTimer.htm">定时的子程序</a>、<a href="../commands/Menu.htm">自定义菜单项</a>等等)不能中断它。在这个时候，那些定时器都不会运行，并且如果用户尝试创建线程(比如按下<a href="../Hotkeys.htm">热键</a>或 <a href="../commands/GuiControls.htm#Button">GUI 按钮</a>)的话，将无任何反应也不会被缓存起来。由于这个原因，通常设计时最好让高优先级的线程尽快结束，或者使用 <a href="../commands/Critical.htm">Critical</a> 而不是将它们设置成高优先级。</p>
<p>默认优先级是 0。所有线程都使用默认优先级除非被下列方法之一所改变:<br>
1) 通过 <a href="../commands/SetTimer.htm">SetTimer</a> 给一个定时的子程序指定优先级。<br>
2) 通过 <a href="../commands/Hotkey.htm">Hotkey</a> 命令给一个热键指定优先级。<br>
3) 在定义一个<a href="../Hotstrings.htm">热字符串</a>时指定优先级，或者通过 <a href="../commands/_Hotstring.htm">#Hotstring</a> 指令。<br>
4) 通过 <a href="../commands/Menu.htm">Menu</a> 命令给一个自定义菜单项指定优先级。<br>
5) 通过 <a href="../commands/Thread.htm">Thread</a> 命令来设置<strong>当前线程</strong>自身的优先级。</p>
<p>不管<strong>当前线程</strong>的优先级高低，<a href="../commands/OnExit.htm">OnExit</a> 子程序(如果有的话)在它被调用时将总能运行起来。</p>

</body>
</html>